#include <stdio.h>
#include <unistd.h>

/*
文件访问权限测试
*/


/*
系统调用
unistd.h: 提供对操作系统功能的访问，包括 access() 函数。
R_OK、W_OK、X_OK 是常量，它们是 access() 函数中用于表示文件访问权限的标志。它们的类型是 整数常量，具体来说是 int 类型。

这些常量的定义在 <unistd.h> 头文件中。它们用于指示你希望检查文件的哪些权限。access() 函数会根据这些标志来检查文件或目录的权限。
运行程序并传递路径参数：你需要在运行程序时通过命令行传递一个文件路径作为参数。例如：
./a.out /path/to/your/file.txt

*/
int test1(char *filepath)
{
    int r = access(filepath, F_OK);
    if (r == -1)
    {
        perror("access failed");
        return -1;
    }
    puts("access执行成功--文件或文件夹存在");
}

int test2(char *filepath)
{
    int r = access(filepath, X_OK);
    if (r == -1)
    {
        perror("access failed");
        return -1;
    }
    puts("access执行成功--文件可读");
}

/*
    01011011
|   10000010
-----------------
    11011011
*/
int test3(char *filepath)
{
    int r = access(filepath, R_OK | W_OK | X_OK);
    if (r == -1)
    {
        perror("access failed");
        return -1;
    }
    puts("access执行成功--文件可读可写");
}

int main(int argc, char *argv[])
{
    // 通过main函数的形式参数输入文件的路径
    if (argc < 2)
    {
        puts("缺少执行参数");
        return -1;
    }
    //test1(argv[1]);
    // test2(argv[1]);
    test3(argv[1]);

    return 0;
}
